Skip to content

Conversation

@SuperKali
Copy link
Member

Summary

Fixes mono audio output on RK3576 NanoPi R76S and M5 boards when using HDMI output. The issue was caused by the HDMI codec driver incorrectly advertising capture capability on output-only hardware.

Problem

Users experience mono audio (single channel) when connecting HDMI displays, with kernel errors:
hdmi-audio-codec: Only one simultaneous stream supported!
ASoC: error at snd_soc_dai_startup on i2s-hifi: -22

Root Cause Analysis

Through detailed debug logging, we identified that:

  1. The hdmi-codec driver advertises both playback and capture capabilities
  2. HDMI-TX hardware is output-only - it should NOT support capture
  3. PulseAudio detects capture support and attempts to open capture streams
  4. When capture stream opens while playback is active, the codec's busy flag check rejects it
  5. This causes audio initialization to partially fail, resulting in mono output

Debug log showing the issue:
[36.916883] startup: stream=0 (PLAYBACK) → SUCCESS
[36.924680] startup: stream=1 (CAPTURE) → FAILS (busy conflict)
Result: Only one stream active = mono audio

Solution

Commit 1: DTS cleanup

  • Disable unused spdif_tx3 interface on R76S (no DisplayPort)

Commit 2: Driver fix

  • Disable capture capability in hdmi-codec.c by setting channels_min/max = 0
  • Prevents PulseAudio from attempting invalid capture operations
  • Allows proper stereo playback initialization

Testing

Before: Mono audio + kernel errors
After: Stereo audio, no errors

# Verified on NanoPi R76S with HDMI output
speaker-test -c 2 -t wav -l 1  # Both channels working ✅

dmesg after fix:
[36.916883] startup: stream=0 (PLAYBACK) → SUCCESS
[36.924680] startup: stream=0 (PLAYBACK) → SUCCESS
No capture attempts, no errors ✅

Disable spdif_tx3 interface as it's not used on the R76S
(no DisplayPort output on this board).
HDMI-TX hardware is output-only but the driver incorrectly advertises
capture capability. This causes PulseAudio to attempt opening capture
streams, which triggers busy flag conflicts with playback streams,
resulting in mono audio output.

Solution: Disable capture support by setting channels_min/max to 0
for both I2S and SPDIF DAIs when used with HDMI-TX.

Note: Mainline kernel has the same issue. An official fix is planned
with the new HDMI Codec Framework being developed by Linaro (2025).

Fixes mono audio on: RK3576 NanoPi R76S, NanoPi M5
Tested-on: NanoPi R76S
@SuperKali SuperKali merged commit 78c67d9 into armbian:rk-6.1-rkr5.1 Nov 20, 2025
1 check passed
@SuperKali SuperKali deleted the fix-r76s-hdmi-audio branch November 20, 2025 17:51
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants